﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Onetube.Entities.Enums;
using Onetube.Entities.VideoQuery;

namespace Onetube.Providers.Interfaces
{
    public interface IYoutubeVideoProvider
    {
        Task<VideoQueryResult> GeVideoInfoAsync(string videoId, string regionCode, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetMostPopularVideosAsync(string regionCode, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetMostPopularVideosPrevAsync(string prevPageToken, string regionCode, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetMostPopularVideosNextAsync(string nextPageToken, string regionCode, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetMostViewedVideosAsync(string regionCode, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetVideosByCategoryAsync(string regionCode, string categoryId, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetVideosByCategoryPrevAsync(string prevPageToken, string regionCode, string categoryId, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetVideosByCategoryNextAsync(string nextPageToken, string regionCode, string categoryId, string maxResults, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetVideosByChannelIdAsync(string channelId, string regionCode, string categoryId, string maxResults, SearchOrder order, CancellationTokenSource cancelTask);

        Task<Onetube.Models.SearchVideo.SearchVideoResult> GetVideosByChannelIdAsyncPrevAsync(string prevPageToken, string channelId, string regionCode, string categoryId, string maxResults, SearchOrder order, CancellationTokenSource cancelTask);

        Task<Models.SearchVideo.SearchVideoResult> GetVideosByChannelIdAsyncNextAsync(string nextPageToken, string channelId, string regionCode, string categoryId, string maxResults, SearchOrder order, CancellationTokenSource cancelTask);

        Task<Models.SearchVideo.SearchVideoResult> GetRelatedVideosByVideoIdAsync(string videoId, string regionCode, string maxResults, CancellationTokenSource cancelTask);

        Task<Models.SearchVideo.SearchVideoResult> GetRelatedVideosByVideoIdNextPageAsync(string videoId, string regionCode, string maxResults,string nextPageToken, CancellationTokenSource cancelTask);
    }
}